const express=require('express');
const config=require('../config');
const common=require('../libs/common');
const fs=require('fs');

let router=express.Router();
module.exports=router;

//进入所以的admin相关的页面之前，
//都要校验用户身份--如果没有登录，则跳转到登录(/admin/login)
router.use((req,res,next)=>{//在这设admin_token，用户的以后可设为token
	//在cookie-parser库中，req有cookies属性，res有cookie属性
	if(!req.cookies['admin_token'] && req.path!='/login'){//用path不会带?后面的
		//没登录，所以转到login页面
		//等待下面操作
		console.log(req.url)//req.url保存你最早想登陆的网址ref
		res.redirect(`/admin/login?ref=${req.url}`);
		//会重定向到login页面，login页面时，会被get渲染，post接收
	}else{
		//当下面的login的post完成登陆后，重定向到根目录时
		//会来到这里
		if(req.path=='/login'){
		//当页面还保存token时,重新登录
		//跑去登录
			next();
		}else{//登录过了,校验token,防止用户伪造token 
		req.db.query(`SELECT * FROM admin_token_table WHERE ID='${req.cookies['admin_token']}'`,(err,data)=>{
			if(err){
				res.sendStatus(500);
			}else if(data.length==0){//伪造的或出问题
				//url和原生一样会在后面带问号
				res.redirect(`/admin/login?ref=${req.url}`);
			}else{//获取ID,登录过的(第二次进入)
				req.admin_ID=data[0]['admin_ID'];
				next();
			}
		})
	}
	}
});

//get:正常把login页面渲染出来就好
router.get('/login',(req,res)=>{
	console.log('GET');
	//创建ref属性,使页面重新回到之前请求的页面
	//当ref为空时，变成undefind,所以要或运算 
	res.render('login',{error_msg:'',ref:req.query['ref']||''});

});

//POST:处理登录相关的请求
router.post('/login',(req,res,next)=>{
	//username和前端的name名相关
	//登录过的，密码肯定保存在req.body里面
	let {username,password}=req.body;

	function setToken(id){
				//回调后，把id返回给cookie,让cookie把数据返回给前台
				let ID=common.uuid();
				let oDate=new Date();
				//20分钟
				oDate.setMinutes(oDate.getMinutes()+20);

				//数据库都是秒要除以1000
				let t=Math.floor(oDate.getTime()/1000);
				//把admin_table的ID映射到admin_token_table的admin_ID里，
				//而admin_token_table的ID则是由uuid生成，顺便返回给前台
				req.db.query(`INSERT INTO admin_token_table (ID , admin_ID,expires) VALUE('${ID}','${id}',${t})`,err=>{
					if(err){
						res.sendStatus(500);
					}else{//把ID传给前台admin_token
						res.cookie('admin_token',ID);

						let ref=req.query['ref'];
						if (!ref) {
							ref='';
						}//登录后,返回前面请求的页面
						//如果是空，则返回上面的根目录
						res.redirect('/admin'+ref);
					}
				})
					}

	//判断两次,第一次为超级管理员，第二为普通管理员
	if(username==config.root_username){
		//匹对在config中保存的密码
		if(common.md5(password)==config.root_password){
			console.log('superRoot');
			setToken(1);

		}else{
			console.log('superRoot login failed');
			showError('用户名或密码有误');
		}
	}else{//验证管理员登录
			req.db.query(`SELECT * FROM admin_table WHERE username='${username}'`,(err,data)=>{
				if(err){
					console.log(err)
					showError('数据库有错');
				}else if(data.length==0){
					showError('用户名或密码有误');
				}else{
					if(data[0].password==common.md5(password)){//password为前台输入的密码
						//把管理员ID返回给cookie，
						//这是建立在数据库已经有了管理员的基础上
						setToken(data[0].ID);
						console.log('普通管理员登录成功');
						
					}else{
						showError('用户名或密码有误');
						
					}
				}
			})
		}

		function showError(msg){//封装--返回错误信息
			//不成功时，返回到login上再次渲染。渲染可以加任何数据
			//重新到页面时，表单提交时，没有保存ref，
			//(可以在前台写上ref,但undefined不好)把ref交给渲染来解决，
			res.render('login',{error_msg:msg,ref:req.query['ref']||''});
		}
})

//在上面已经登录成功(setToken()后)，重定向到这来的根目录
router.get('/',(req,res)=>{
	res.redirect('/admin/house')
});


//获取
router.get('/house',(req,res)=>{

	//分页
	const size=2;//一页中显示数据条数
	let page=req.query.page;//page为当前页

	console.log(page)
	if(!page){//判断客户伪造
		page=1;
	}else if(!/^[1-9]\d*$/.test(page)){
		page=1;
	}
	//起点：第n页:(n-1)*size
	let start=(page-1)*size;

	//搜索
	let like_seg='1=1';//任何东西=任何东西,避免空
	if (req.query.keyword) {//有搜索东西时才进行
		let keys=req.query.keyword.split(/\s+/g);
		//['a','b']=>["%a%",%b%]  mysql语句 LIKE%=*
		like_seg= keys.map(item=>` title LIKE '%${item}%'`).join(' OR ');
	}
	

	//获取数据,LIMIT：限制之意,限制呈现出来的数据数量
	req.db.query(`SELECT  FROM house_table WHERE ${like_seg} LIMIT ${start},${size}`,(err,house_data)=>{
		console.log(start,size)
		if(err){
			res.sendStatus(500)
		}else{
			//2.COUNT为获取总数据量 AS是赋予c别名
			req.db.query(`SELECT COUNT(*) AS c FROM house_table  WHERE ${like_seg}`,(err,data)=>{
				if(err){
					res.sendStatus(500);
				}else if(data.length==0){
					res.sendStatus(500);
				}else{//总页数除以每页显示数量,向上取整
					res.render('index',{
						data:house_data,
						show_page_count:9,//显示多少页数
						cur_page:parseInt(page),//当前页
						page_count:Math.ceil(data[0].c/size),//总页数
						keyword:req.query.keyword//返回给前台的keyword
					});
				}

				
			})
			
		}
	})
	});

//添加 || 修改
router.post('/house',(req,res)=>{
	//时间
	req.body['sale_time']=Math.floor(new Date(req.body['sale_time']).getTime()/1000);
	req.body['submit_time']=Math.floor(new Date(req.body['submit_time']).getTime()/1000);

	if(req.body['is_mod']=='true'){//设置is_mod判断是否为修改或添加
		const
		fields=['title','sub_title','position_main','position_second','ave_price','area_min','area_max','tel','sale_time','submit_time','building_type','property_types'];

		let arr=[];

		fields.forEach(key=>{
			 arr.push(`${key}='${req.body[key]}'`);
		})
		
		let sql=`UPDATE house_table SET ${arr.join(',')} WHERE ID='${req.body['old_id']}'`;
		req.db.query(sql,err=>{
			if(err){
				res.sendStatus(404,'no this data');
				console.log(err)
			}else {
				res.redirect('/admin/house')
			}
		})
	}else{//添加
		//获取前台的信息
		//console.log(req.body);

		//只存文件名
		let aImgPath=[];
		let aImgRealPath=[];

		for(let i=0;i<req.files.length;i++){
			// console.log(req.files[i].fieldname)
			switch(req.files[i].fieldname){//filename
				//console.log(req.files[i].fieldname)
				case 'main_img'://保存大图路径和文件名,与前台的name相对应
					req.body['main_img_path']=req.files[i].filename;
					req.body['main_img_real_path']=req.files[i].path.replace(/\\/g,'\\\\');
				break;
				case 'img':
					aImgPath.push(req.files[i].filename);//在mysql中\会被转义，所以换成\\
					aImgRealPath.push(req.files[i].path.replace(/\\/g,'\\\\'));
				break;
				case 'property_imgs':
					req.body['property_img_paths']=req.files[i].filename;
					req.body['property_img_real_paths']=req.files[i].path.replace(/\\/g,'\\\\');
				break;
			}
										}
		req.body['ID']=common.uuid();
		req.body['admin_ID']=req.admin_ID;

		req.body['img_paths']=aImgPath.join(',');
		req.body['img_real_paths']=aImgRealPath.join(',');

		//console.log(req.body);
		let arrFied=[];
		let arrValue=[];

		for(let name in req.body){
			if(name=='is_mod'||name=="old_id"){
				}else{
			arrFied.push(name);
			arrValue.push(req.body[name]);}
		}

		let sql=`INSERT INTO house_table (${arrFied.join(',')}) VALUE('${arrValue.join("','")}')`;
		req.db.query(sql,err=>{
			if(err){
				console.log(err)
				res.sendStatus(500);
			}else{
				res.redirect('/admin/house');
				//重定向到house，变成get，到get中的显示数据部分
			}
		})
	}
	
	})

//删除
router.get('/house/delete',(req,res)=>{
	let ID=req.query['id'];

	let aID=ID.split(',');

	let b_err=false;
	aID.forEach(item=>{//防伪造
		if(!/^(\d|[a-f]){32}$/.test(item)){
			b_err=true;
		}
	});

	if(b_err){
		res.sendStatus(400);
	}else{
		let id_index=0;
		_next();
		function _next(){
			let ID=aID[id_index++];

					//1.删除关联的图片
		req.db.query(`SELECT * FROM house_table WHERE ID='${ID}'`,(err,data)=>{
			if(err){
				res.sendStatus(500);
			}else if(data.length==0){
				res.sendStatus(404,'no this data');
			}else{
				let arr=[];//存删除的文件
				data[0]['main_img_real_path']&&arr.push(data[0]['main_img_real_path']);
				if(data[0]['img_real_paths']){
					data[0]['img_real_paths'].split(',').forEach(item=>{
						arr.push(item)
					});
				}
				if (data[0]['property_img_real_paths']) {
					data[0]['property_img_real_paths'].split(',').forEach(item=>{
						arr.push(item)
					})
				}


				function deleteFromDB(){
								//1.删除完了
								//2.删除数据本身
								req.db.query(`DELETE FROM house_table WHERE ID='${ID}'`,err=>{
									if(err){
										res.sendStatus(500);
										console.log('adsfsa')
									}else{
									//重定向house页面，使更新后的后台数据再次前台
										//res.redirect('/admin/house');
										if (id_index<aID.length) {
											_next();
											}else{//删完了,回原来的页面
												res.redirect('/admin/house');
											}
									}
								})
				}

				if(arr.length>0){
					//for
				let i=0;

				next();
				function next(){//函数在里面添加
					fs.unlink(arr[i],err=>{
						if(err){
							console.log(arr);
							res.sendStatus(500);
						}else{
							i++;
							if(i>=arr.length){
								deleteFromDB();
							}else{
							next();
						}
						}
					})
					}
					
				}else{//没有文件可删时
					deleteFromDB();
				}
				

			}
		})
		}
	}
	})

//接口
router.get('/house/get_data',(req,res)=>{
	let id=req.query.id;

	if(!id){
		res.sendStatus(404);
	}else if(!/^[\da-f]{32}$/.test(id)){
		res.sendStatus(400)
	}else{
		req.db.query(`SELECT * FROM house_table WHERE ID = '${id}'`,(err,data)=>{
			if(err){
				res.sendStatus(400);
			}else if(data.length==0){
				res.sendStatus(404);
			}else{
				res.send(data[0]);//返回数据给ajax中的json
			}
		})
	}
});









